{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "622ec48e",
   "metadata": {},
   "source": [
    "# 轨迹偏移的处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9b23c2e8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:24.831029Z",
     "start_time": "2024-08-20T11:07:24.814769Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.interpolate import CubicSpline\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4a4a3aa2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:25.088926Z",
     "start_time": "2024-08-20T11:07:25.081102Z"
    }
   },
   "outputs": [],
   "source": [
    "#采用众数去替换静止时的经纬度\n",
    "def jingzhidian(data):\n",
    "    a=[]\n",
    "    for i in range(0,len(data)):\n",
    "        if(data['活动状态'][i]==1):\n",
    "            a.append(i)\n",
    "    print(a)\n",
    "\n",
    "    star=0\n",
    "    for i in range(0,len(a)):#0-206\n",
    "        if(i<len(a)):\n",
    "            if(a[i]-a[i-1]>3):\n",
    "                # 计算众数\n",
    "                mode_val_1 = data.iloc[star:a[i]]['经度'].value_counts().idxmax()\n",
    "                mode_val_2 = data.iloc[star:a[i]]['纬度'].value_counts().idxmax()\n",
    "                for j in range(star,a[i]):\n",
    "                    data['经度'][j]=mode_val_1\n",
    "                    data['纬度'][j]=mode_val_2\n",
    "        else:\n",
    "            if(len(data)-a[i]>3):\n",
    "                print(star)\n",
    "                mode_val_1 = data.iloc[star:a[i]]['经度'].value_counts().idxmax()\n",
    "                mode_val_2 = data.iloc[star:a[i]]['纬度'].value_counts().idxmax()\n",
    "                for j in range(star,a[i]):\n",
    "                    data['经度'][j]=mode_val_1\n",
    "                    data['纬度'][j]=mode_val_2\n",
    "        star=a[i]+3\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0ee167d9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:25.270351Z",
     "start_time": "2024-08-20T11:07:25.264215Z"
    }
   },
   "outputs": [],
   "source": [
    "# 卡尔曼滤波\n",
    "class KalmanFilter:  \n",
    "    def __init__(self, process_variance, measurement_variance,x,y): #构造方法\n",
    "        self.x = np.array([[x], [y]])  # 初始状态：经度和纬度  \n",
    "        self.P = np.eye(2) * 1.0  # 初始协方差矩阵  \n",
    "        self.A = np.eye(2)  # 状态转移矩阵  \n",
    "        self.Q = np.eye(2) * process_variance  # 过程噪声协方差矩阵  \n",
    "        self.H = np.eye(2)  # 观测矩阵  \n",
    "        self.R = np.eye(2) * measurement_variance  # 测量噪声协方差矩阵  \n",
    "  \n",
    "    def update(self, z):  \n",
    "        # 预测  \n",
    "        x_pred = np.dot(self.A, self.x)  \n",
    "        P_pred = np.dot(np.dot(self.A, self.P), self.A.T) + self.Q  #self.A.T为self.A的转置矩阵   （（A*P）*A-1）+Q\n",
    "  \n",
    "        # 更新  \n",
    "        S = np.dot(np.dot(self.H, P_pred), self.H.T) + self.R  \n",
    "        K = np.dot(np.dot(P_pred, self.H.T), np.linalg.inv(S))  #np.linalg.inv(S)计算S矩阵的逆矩阵\n",
    "        self.x = x_pred + np.dot(K, (z - np.dot(self.H, x_pred))) #更新经纬度的坐标，为下一次预测的初始状态\n",
    "        self.P = np.dot((np.eye(len(self.x)) - np.dot(K, self.H)), P_pred) #更新协方差矩阵\n",
    "  \n",
    "    def get_state(self):  \n",
    "        return self.x "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f6a5d1e6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:25.709633Z",
     "start_time": "2024-08-20T11:07:25.704601Z"
    }
   },
   "outputs": [],
   "source": [
    "# 中值滤波\n",
    "def zhongzhi(data,step):#data表示数据集，step表示步长即前后取的点数\n",
    "    long=len(data)\n",
    "    step=step\n",
    "    star_index=step\n",
    "    end_index=long-step\n",
    "    for i in range(star_index,end_index):\n",
    "        a=data.iloc[i-step:i+step+1].sort_values(by='经度')\n",
    "        data.at[i, '经度']=a.iloc[step][1]\n",
    "        b=data.iloc[i-step:i+step+1].sort_values(by='纬度')\n",
    "        data.at[i, '纬度']=b.iloc[step][2]\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f4643f9f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:25.921276Z",
     "start_time": "2024-08-20T11:07:25.912751Z"
    }
   },
   "outputs": [],
   "source": [
    "#线性插值\n",
    "def xianxingchazhi(data):\n",
    "    \n",
    "    drop_arr=[]\n",
    "    result_arr=[]\n",
    "    for i in range(0,data(len)):\n",
    "        if(data.iloc[i]['定位状态']==1):\n",
    "            drop_arr.append(i)\n",
    "        else:\n",
    "            result_arr.append(i)\n",
    "    \n",
    "    # 定义要删除的索引列表  \n",
    "    # 使用 ~isin 来生成一个布尔索引，这个索引在要删除的索引位置为 False，其他位置为 True  \n",
    "    bool_index = ~data.index.isin(drop_arr)  \n",
    "\n",
    "    # 使用这个布尔索引来过滤 DataFrame，得到不包含这些索引的行  \n",
    "    filtered_data_3 = data.loc[bool_index]  \n",
    "\n",
    "    # 如果你想要直接修改原始的 DataFrame  \n",
    "    # 注意：这将改变 data_3，且不会返回任何值（除非你重新赋值给 data_3）  \n",
    "    # data_3 = data_3.loc[~data_3.index.isin(indices_to_drop)]  \n",
    "    \n",
    "    #线性插值\n",
    "    # 假设 data_3 是已经存在的 DataFrame，且其索引与 times 数组对应  \n",
    "    # ... 这里应该是 data_3 的创建或加载代码 ...  \n",
    "\n",
    "    # 假设的经纬度数据点（按时间顺序排列）  \n",
    "    times = np.array(result_arr)  # 时间点  \n",
    "    longitudes = np.array(filtered_data_3['经度'])  # 经度  \n",
    "    latitudes = np.array(filtered_data_3['纬度'])        # 纬度  \n",
    "\n",
    "    # 缺失点的时间  \n",
    "    # drop_arr = [2.5, 3.5]  # 假设这是缺失的时间点列表  \n",
    "\n",
    "    for missing_time in drop_arr:  \n",
    "        # 找到缺失时间点之前的点  \n",
    "        prev_idx = None  \n",
    "        for i, t in enumerate(times):  \n",
    "            if t <= missing_time:  \n",
    "                prev_idx = i  \n",
    "                if i + 1 < len(times) and times[i + 1] > missing_time:  \n",
    "                    break  \n",
    "\n",
    "        # 进行插值  \n",
    "        if prev_idx is not None and prev_idx + 1 < len(times):  \n",
    "            t0, t1 = times[prev_idx], times[prev_idx + 1]  \n",
    "            lon0, lon1 = longitudes[prev_idx], longitudes[prev_idx + 1]  \n",
    "            lat0, lat1 = latitudes[prev_idx], latitudes[prev_idx + 1]  \n",
    "\n",
    "            # 线性插值公式  \n",
    "            lon_missing = lon0 + (lon1 - lon0) * (missing_time - t0) / (t1 - t0)  \n",
    "            lat_missing = lat0 + (lat1 - lat0) * (missing_time - t0) / (t1 - t0)  \n",
    "\n",
    "            # 这里假设 data_3 的索引与 times 数组相同  \n",
    "            # 替换掉表中的数据（如果 data_3 的索引是整数且基于时间点的顺序）  \n",
    "            # 注意：如果 data_3 的索引不是整数或不是基于时间点，则需要相应地调整索引  \n",
    "            if missing_time in data.index:  # 确保索引在 DataFrame 中  \n",
    "                data.at[data.index[missing_time], '经度'] = round(lon_missing, 6)  \n",
    "                data.at[data.index[missing_time], '纬度'] = round(lat_missing, 6)  \n",
    "            else:  \n",
    "                print(f\"Index {prev_idx} is not in data_3\") \n",
    "        else:  \n",
    "            print(f\"Missing time point {missing_time} is out of bounds or there are not enough data points for interpolation.\")\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "566f7329",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:26.285572Z",
     "start_time": "2024-08-20T11:07:26.279830Z"
    }
   },
   "outputs": [],
   "source": [
    "# 三次样条插值\n",
    "def interpolate_cubic_spline_by_index(series):  \n",
    "    # 移除NaN值  \n",
    "    valid_indices = series[~np.isnan(series)].index  \n",
    "    valid_values = series[~np.isnan(series)]  \n",
    "      \n",
    "    # 如果没有足够的数据点进行插值，则返回原始序列（或可以填充为NaN）  \n",
    "    if len(valid_indices) < 2:  # 三次样条至少需要两个点  \n",
    "        return series.fillna(np.nan)  \n",
    "      \n",
    "    # 使用DataFrame的索引作为插值的x坐标  \n",
    "    x_vals = np.array(valid_indices, dtype=float)  # 确保x_vals是浮点数数组（尽管在这个例子中可能是整数）  \n",
    "      \n",
    "    # 使用CubicSpline进行插值  \n",
    "    spline = CubicSpline(x_vals, valid_values)  \n",
    "      \n",
    "    # 对所有索引进行插值（这里我们假设索引是连续的整数，如果不连续，则需要先调整）  \n",
    "    # 但为了简化，我们直接对整个索引范围进行插值，并替换原始NaN值  \n",
    "    all_indices = np.arange(len(series))  \n",
    "    interpolated_values = spline(all_indices)  \n",
    "      \n",
    "    # 创建一个新的Series来存储插值结果  \n",
    "    interpolated_series = pd.Series(interpolated_values, index=series.index)  \n",
    "      \n",
    "    # 返回插值后的Series  \n",
    "    return interpolated_series  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b4c220a4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.428533Z",
     "start_time": "2024-08-20T11:07:26.817593Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>序号</th>\n",
       "      <th>设备状态</th>\n",
       "      <th>数据类型</th>\n",
       "      <th>定位时间</th>\n",
       "      <th>设备名称</th>\n",
       "      <th>设备编码</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>获取位置</th>\n",
       "      <th>警报状态</th>\n",
       "      <th>事件</th>\n",
       "      <th>电量</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>海拔高度</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8848</th>\n",
       "      <td>8849</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>64%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8849</th>\n",
       "      <td>8850</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8850</th>\n",
       "      <td>8851</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8851</th>\n",
       "      <td>8852</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8852</th>\n",
       "      <td>8853</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>64%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8853 rows × 16 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        序号                                          设备状态  数据类型  \\\n",
       "0        1  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "1        2  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "2        3  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "3        4  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "4        5  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "...    ...                                           ...   ...   \n",
       "8848  8849  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8849  8850  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8850  8851  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8851  8852  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8852  8853  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "\n",
       "                     定位时间          设备名称          设备编码          经度         纬度  \\\n",
       "0     2024-07-29 10:02:28  489076140280  489076140280  113.797464  22.688276   \n",
       "1     2024-07-29 10:02:58  489076140280  489076140280  113.797464  22.688276   \n",
       "2     2024-07-29 10:03:28  489076140280  489076140280  113.797464  22.688276   \n",
       "3     2024-07-29 10:03:58  489076140280  489076140280  113.797464  22.688276   \n",
       "4     2024-07-29 10:04:28  489076140280  489076140280  113.797464  22.688276   \n",
       "...                   ...           ...           ...         ...        ...   \n",
       "8848  2024-08-01 15:28:50  489076140280  489076140280  113.943112  22.688810   \n",
       "8849  2024-08-01 15:29:20  489076140280  489076140280  113.943112  22.688810   \n",
       "8850  2024-08-01 15:29:50  489076140280  489076140280  113.943112  22.688810   \n",
       "8851  2024-08-01 15:30:20  489076140280  489076140280  113.943112  22.688810   \n",
       "8852  2024-08-01 15:30:50  489076140280  489076140280  113.943112  22.688810   \n",
       "\n",
       "      获取位置    警报状态   事件   电量     定位方式   方向  海拔高度   速度  \n",
       "0     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "1     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "2     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "3     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "4     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "...    ...     ...  ...  ...      ...  ...   ...  ...  \n",
       "8848  获取定位     NaN  NaN  64%  GPS有效定位  252    69  0.0  \n",
       "8849  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8850  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8851  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8852  获取定位     NaN  NaN  64%  GPS有效定位  252    69  0.0  \n",
       "\n",
       "[8853 rows x 16 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=pd.read_excel(\"D:/data/0280/0280原始数据.xlsx\")\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "eb7a5f1a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.434233Z",
     "start_time": "2024-08-20T11:07:28.430537Z"
    }
   },
   "outputs": [],
   "source": [
    "# # 删除'A'列中值为0的行  \n",
    "# data = data[data['定位方式'] != 'LBS']\n",
    "# data\n",
    "# # 重置索引列\n",
    "# data = data.reset_index(drop=True)\n",
    "# data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "7cbb6a9e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.451329Z",
     "start_time": "2024-08-20T11:07:28.435239Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>序号</th>\n",
       "      <th>设备状态</th>\n",
       "      <th>数据类型</th>\n",
       "      <th>定位时间</th>\n",
       "      <th>设备名称</th>\n",
       "      <th>设备编码</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>获取位置</th>\n",
       "      <th>警报状态</th>\n",
       "      <th>事件</th>\n",
       "      <th>电量</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>海拔高度</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>外壳破坏报警</td>\n",
       "      <td>NaN</td>\n",
       "      <td>68%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>74</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8822</th>\n",
       "      <td>8849</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>64%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8823</th>\n",
       "      <td>8850</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8824</th>\n",
       "      <td>8851</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8825</th>\n",
       "      <td>8852</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>63%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8826</th>\n",
       "      <td>8853</td>\n",
       "      <td>锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位</td>\n",
       "      <td>实时数据</td>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>489076140280</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>获取定位</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>64%</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>69</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8827 rows × 16 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        序号                                          设备状态  数据类型  \\\n",
       "0        1  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "1        2  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "2        3  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "3        4  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "4        5  锁杆开,无充电,解封,静止,短连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "...    ...                                           ...   ...   \n",
       "8822  8849  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8823  8850  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8824  8851  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8825  8852  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "8826  8853  锁杆开,无充电,解封,静止,长连接,东经,北纬,网络状态缺省,关闭,卡1,GPS有效定位  实时数据   \n",
       "\n",
       "                     定位时间          设备名称          设备编码          经度         纬度  \\\n",
       "0     2024-07-29 10:02:28  489076140280  489076140280  113.797464  22.688276   \n",
       "1     2024-07-29 10:02:58  489076140280  489076140280  113.797464  22.688276   \n",
       "2     2024-07-29 10:03:28  489076140280  489076140280  113.797464  22.688276   \n",
       "3     2024-07-29 10:03:58  489076140280  489076140280  113.797464  22.688276   \n",
       "4     2024-07-29 10:04:28  489076140280  489076140280  113.797464  22.688276   \n",
       "...                   ...           ...           ...         ...        ...   \n",
       "8822  2024-08-01 15:28:50  489076140280  489076140280  113.943112  22.688810   \n",
       "8823  2024-08-01 15:29:20  489076140280  489076140280  113.943112  22.688810   \n",
       "8824  2024-08-01 15:29:50  489076140280  489076140280  113.943112  22.688810   \n",
       "8825  2024-08-01 15:30:20  489076140280  489076140280  113.943112  22.688810   \n",
       "8826  2024-08-01 15:30:50  489076140280  489076140280  113.943112  22.688810   \n",
       "\n",
       "      获取位置    警报状态   事件   电量     定位方式   方向  海拔高度   速度  \n",
       "0     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "1     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "2     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "3     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "4     获取定位  外壳破坏报警  NaN  68%  GPS有效定位  326    74  0.0  \n",
       "...    ...     ...  ...  ...      ...  ...   ...  ...  \n",
       "8822  获取定位     NaN  NaN  64%  GPS有效定位  252    69  0.0  \n",
       "8823  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8824  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8825  获取定位     NaN  NaN  63%  GPS有效定位  252    69  0.0  \n",
       "8826  获取定位     NaN  NaN  64%  GPS有效定位  252    69  0.0  \n",
       "\n",
       "[8827 rows x 16 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除'A'列中值为0的行  \n",
    "data = data[data['经度'] != 0]\n",
    "data\n",
    "# 重置索引列\n",
    "data = data.reset_index(drop=True)\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6eec8e1a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.456478Z",
     "start_time": "2024-08-20T11:07:28.453334Z"
    }
   },
   "outputs": [],
   "source": [
    "# 定义一个函数来提取指定位置的字段内容\n",
    "def extract_field(text, position):\n",
    "    # 根据逗号分隔字符串\n",
    "    fields = text.split(',')\n",
    "    \n",
    "    # 确保位置有效\n",
    "    if position < len(fields):\n",
    "        return fields[position]\n",
    "    else:\n",
    "        return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f13d166a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.478086Z",
     "start_time": "2024-08-20T11:07:28.458482Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8822</th>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8823</th>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8824</th>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8825</th>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8826</th>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>静止</td>\n",
       "      <td>GPS有效定位</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8827 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                     定位时间          经度         纬度 活动状态     定位方式   方向   速度\n",
       "0     2024-07-29 10:02:28  113.797464  22.688276   静止  GPS有效定位  326  0.0\n",
       "1     2024-07-29 10:02:58  113.797464  22.688276   静止  GPS有效定位  326  0.0\n",
       "2     2024-07-29 10:03:28  113.797464  22.688276   静止  GPS有效定位  326  0.0\n",
       "3     2024-07-29 10:03:58  113.797464  22.688276   静止  GPS有效定位  326  0.0\n",
       "4     2024-07-29 10:04:28  113.797464  22.688276   静止  GPS有效定位  326  0.0\n",
       "...                   ...         ...        ...  ...      ...  ...  ...\n",
       "8822  2024-08-01 15:28:50  113.943112  22.688810   静止  GPS有效定位  252  0.0\n",
       "8823  2024-08-01 15:29:20  113.943112  22.688810   静止  GPS有效定位  252  0.0\n",
       "8824  2024-08-01 15:29:50  113.943112  22.688810   静止  GPS有效定位  252  0.0\n",
       "8825  2024-08-01 15:30:20  113.943112  22.688810   静止  GPS有效定位  252  0.0\n",
       "8826  2024-08-01 15:30:50  113.943112  22.688810   静止  GPS有效定位  252  0.0\n",
       "\n",
       "[8827 rows x 7 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取 DataFrame 中指定列的第三个逗号后面第四个字段内容\n",
    "# 注意位置是从0开始的，所以第四个字段位置是3\n",
    "data['活动状态'] = data['设备状态'].apply(lambda x: extract_field(x, 3))\n",
    "data=data[['定位时间','经度','纬度','活动状态','定位方式','方向','速度']]\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c41e7f55",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.492786Z",
     "start_time": "2024-08-20T11:07:28.479091Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\2643871110.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['活动状态']=data['活动状态'].map({'静止':0,'运动':1})\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\2643871110.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['定位方式']=data['定位方式'].map({'GPS有效定位':0,'GPS无效定位':1,'LBS':1})\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8822</th>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8823</th>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8824</th>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8825</th>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8826</th>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8827 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                     定位时间          经度         纬度  活动状态  定位方式   方向   速度\n",
       "0     2024-07-29 10:02:28  113.797464  22.688276     0     0  326  0.0\n",
       "1     2024-07-29 10:02:58  113.797464  22.688276     0     0  326  0.0\n",
       "2     2024-07-29 10:03:28  113.797464  22.688276     0     0  326  0.0\n",
       "3     2024-07-29 10:03:58  113.797464  22.688276     0     0  326  0.0\n",
       "4     2024-07-29 10:04:28  113.797464  22.688276     0     0  326  0.0\n",
       "...                   ...         ...        ...   ...   ...  ...  ...\n",
       "8822  2024-08-01 15:28:50  113.943112  22.688810     0     0  252  0.0\n",
       "8823  2024-08-01 15:29:20  113.943112  22.688810     0     0  252  0.0\n",
       "8824  2024-08-01 15:29:50  113.943112  22.688810     0     0  252  0.0\n",
       "8825  2024-08-01 15:30:20  113.943112  22.688810     0     0  252  0.0\n",
       "8826  2024-08-01 15:30:50  113.943112  22.688810     0     0  252  0.0\n",
       "\n",
       "[8827 rows x 7 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将文字类型转换为数字类型\n",
    "data['活动状态']=data['活动状态'].map({'静止':0,'运动':1})\n",
    "data['定位方式']=data['定位方式'].map({'GPS有效定位':0,'GPS无效定位':1,'LBS':1})\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "78aa12ae",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:28.723062Z",
     "start_time": "2024-08-20T11:07:28.720214Z"
    }
   },
   "outputs": [],
   "source": [
    "data_original=data.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "67b475b8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:30.324148Z",
     "start_time": "2024-08-20T11:07:30.160131Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x= data_original[['经度']]\n",
    "y =data_original[['纬度']]\n",
    "plt.figure(figsize=(5, 5), dpi=100)\n",
    "plt.plot(x, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "95919930",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:36.796006Z",
     "start_time": "2024-08-20T11:07:36.664229Z"
    }
   },
   "outputs": [],
   "source": [
    "#选择定位无效的定位点经纬度，并且使用np.nan填充\n",
    "drop_arr=[]    #定位无效的索引\n",
    "result_arr=[]  #定位有效的索引\n",
    "for i in range(0,1960):\n",
    "    if(data.iloc[i]['定位方式']!=0):\n",
    "        data.at[i,'经度']=np.nan\n",
    "        data.at[i,'纬度']=np.nan\n",
    "        drop_arr.append(i)\n",
    "    else:\n",
    "        result_arr.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "422b5563",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:36.968444Z",
     "start_time": "2024-08-20T11:07:36.959994Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\1938104361.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'] = interpolate_cubic_spline_by_index(data['经度'])\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\1938104361.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'] = interpolate_cubic_spline_by_index(data['纬度'])\n"
     ]
    }
   ],
   "source": [
    "# 对经度和纬度进行插值  \n",
    "data['经度'] = interpolate_cubic_spline_by_index(data['经度'])\n",
    "data['纬度'] = interpolate_cubic_spline_by_index(data['纬度'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c96140f1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:37.528389Z",
     "start_time": "2024-08-20T11:07:37.520287Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8822</th>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8823</th>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8824</th>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8825</th>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8826</th>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8827 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                     定位时间          经度         纬度  活动状态  定位方式   方向   速度\n",
       "0     2024-07-29 10:02:28  113.797464  22.688276     0     0  326  0.0\n",
       "1     2024-07-29 10:02:58  113.797464  22.688276     0     0  326  0.0\n",
       "2     2024-07-29 10:03:28  113.797464  22.688276     0     0  326  0.0\n",
       "3     2024-07-29 10:03:58  113.797464  22.688276     0     0  326  0.0\n",
       "4     2024-07-29 10:04:28  113.797464  22.688276     0     0  326  0.0\n",
       "...                   ...         ...        ...   ...   ...  ...  ...\n",
       "8822  2024-08-01 15:28:50  113.943112  22.688810     0     0  252  0.0\n",
       "8823  2024-08-01 15:29:20  113.943112  22.688810     0     0  252  0.0\n",
       "8824  2024-08-01 15:29:50  113.943112  22.688810     0     0  252  0.0\n",
       "8825  2024-08-01 15:30:20  113.943112  22.688810     0     0  252  0.0\n",
       "8826  2024-08-01 15:30:50  113.943112  22.688810     0     0  252  0.0\n",
       "\n",
       "[8827 rows x 7 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "5f8d7438",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:38.090430Z",
     "start_time": "2024-08-20T11:07:37.888051Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[15, 42, 85, 92, 169, 176, 179, 218, 361, 421, 468, 469, 470, 471, 472, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 504, 505, 506, 507, 508, 509, 510, 512, 514, 515, 522, 540, 541, 545, 546, 547, 548, 549, 550, 551, 566, 605, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 641, 644, 646, 647, 648, 651, 652, 653, 654, 655, 656, 657, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 680, 681, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 734, 736, 737, 738, 739, 740, 741, 743, 744, 745, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 888, 889, 890, 891, 892, 893]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:17: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['经度'][j]=mode_val_1\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_7200\\3342271205.py:18: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['纬度'][j]=mode_val_2\n"
     ]
    }
   ],
   "source": [
    "data=jingzhidian(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "95f6d60a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:38.316112Z",
     "start_time": "2024-08-20T11:07:38.311605Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "定位时间    2024-07-29 17:49:17\n",
       "经度               113.797597\n",
       "纬度                22.688203\n",
       "活动状态                      1\n",
       "定位方式                      1\n",
       "方向                        0\n",
       "速度                      0.0\n",
       "Name: 647, dtype: object"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.iloc[647]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "568dc83f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:45.798320Z",
     "start_time": "2024-08-20T11:07:39.096930Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-07-29 10:02:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-07-29 10:02:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-07-29 10:03:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-07-29 10:03:58</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-07-29 10:04:28</td>\n",
       "      <td>113.797464</td>\n",
       "      <td>22.688276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>326</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8822</th>\n",
       "      <td>2024-08-01 15:28:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8823</th>\n",
       "      <td>2024-08-01 15:29:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8824</th>\n",
       "      <td>2024-08-01 15:29:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8825</th>\n",
       "      <td>2024-08-01 15:30:20</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8826</th>\n",
       "      <td>2024-08-01 15:30:50</td>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8827 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                     定位时间          经度         纬度  活动状态  定位方式   方向   速度\n",
       "0     2024-07-29 10:02:28  113.797464  22.688276     0     0  326  0.0\n",
       "1     2024-07-29 10:02:58  113.797464  22.688276     0     0  326  0.0\n",
       "2     2024-07-29 10:03:28  113.797464  22.688276     0     0  326  0.0\n",
       "3     2024-07-29 10:03:58  113.797464  22.688276     0     0  326  0.0\n",
       "4     2024-07-29 10:04:28  113.797464  22.688276     0     0  326  0.0\n",
       "...                   ...         ...        ...   ...   ...  ...  ...\n",
       "8822  2024-08-01 15:28:50  113.943112  22.688810     0     0  252  0.0\n",
       "8823  2024-08-01 15:29:20  113.943112  22.688810     0     0  252  0.0\n",
       "8824  2024-08-01 15:29:50  113.943112  22.688810     0     0  252  0.0\n",
       "8825  2024-08-01 15:30:20  113.943112  22.688810     0     0  252  0.0\n",
       "8826  2024-08-01 15:30:50  113.943112  22.688810     0     0  252  0.0\n",
       "\n",
       "[8827 rows x 7 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#中值滤波\n",
    "data=zhongzhi(data,step=2)\n",
    "data\n",
    "\n",
    "\n",
    "# #卡尔曼滤波\n",
    "# kf = KalmanFilter(process_variance=0.1, measurement_variance=0.1,x=data['经度'][0],y=data['纬度'][0])  \n",
    "\n",
    "# # 假设这是不准确的经纬度观测值  \n",
    "# measurements = []  \n",
    "# for index, row in data.iterrows():  \n",
    "#     # 提取经度和纬度，并创建NumPy数组  \n",
    "#     measurement = np.array([[row['经度']], [row['纬度']]])  \n",
    "#     # 将NumPy数组添加到measurements列表中  \n",
    "#     measurements.append(measurement)\n",
    "\n",
    "# estimated_coords = []\n",
    "\n",
    "# # 对每个观测值进行更新  \n",
    "# for z in measurements:  \n",
    "#     kf.update(z)\n",
    "#     x = kf.get_state()[0, 0]  # 注意这里使用了numpy的索引方式，假设get_state()返回的是numpy数组  \n",
    "#     y = kf.get_state()[1, 0]\n",
    "#     estimated_coords.append({'经度': x, '纬度': y})   # 将估计的(x, y)坐标添加到列表中\n",
    "# data[['经度','纬度']]=pd.DataFrame(estimated_coords)\n",
    "# data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "8ab36292",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:45.830445Z",
     "start_time": "2024-08-20T11:07:45.805337Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位方式</th>\n",
       "      <th>方向</th>\n",
       "      <th>速度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>8827.000000</td>\n",
       "      <td>8827.000000</td>\n",
       "      <td>8827.000000</td>\n",
       "      <td>8827.000000</td>\n",
       "      <td>8827.000000</td>\n",
       "      <td>8827.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>113.929646</td>\n",
       "      <td>22.688956</td>\n",
       "      <td>0.033987</td>\n",
       "      <td>0.032740</td>\n",
       "      <td>240.038405</td>\n",
       "      <td>0.329161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.041725</td>\n",
       "      <td>0.002478</td>\n",
       "      <td>0.181205</td>\n",
       "      <td>0.177967</td>\n",
       "      <td>52.953913</td>\n",
       "      <td>3.141324</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>113.796792</td>\n",
       "      <td>22.686284</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>252.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>252.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>113.943112</td>\n",
       "      <td>22.688810</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>252.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>113.943688</td>\n",
       "      <td>22.727844</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>359.000000</td>\n",
       "      <td>55.700000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                经度           纬度         活动状态         定位方式           方向  \\\n",
       "count  8827.000000  8827.000000  8827.000000  8827.000000  8827.000000   \n",
       "mean    113.929646    22.688956     0.033987     0.032740   240.038405   \n",
       "std       0.041725     0.002478     0.181205     0.177967    52.953913   \n",
       "min     113.796792    22.686284     0.000000     0.000000     0.000000   \n",
       "25%     113.943112    22.688810     0.000000     0.000000   252.000000   \n",
       "50%     113.943112    22.688810     0.000000     0.000000   252.000000   \n",
       "75%     113.943112    22.688810     0.000000     0.000000   252.000000   \n",
       "max     113.943688    22.727844     1.000000     1.000000   359.000000   \n",
       "\n",
       "                速度  \n",
       "count  8827.000000  \n",
       "mean      0.329161  \n",
       "std       3.141324  \n",
       "min       0.000000  \n",
       "25%       0.000000  \n",
       "50%       0.000000  \n",
       "75%       0.000000  \n",
       "max      55.700000  "
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "de8ca7ef",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-20T11:07:58.969392Z",
     "start_time": "2024-08-20T11:07:58.869419Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1nIqw0AkIiLL0bUQT5827vtDQoBVq0qfr15t/poMYCASEZHlmNpC1GiAyZOBF1+UzyuYx24pDEQiIrKc9u3l9sYNeT9YY9WqZZl6KsFAJCIiy/H2Blq0kPumDKxRgIFIRESWZWq3qSIMRFPdu3INERFVrTpTLxSsbMNArIyPT/ljHTsC169bvxYiInulayEaO9IUKF0QPDvb/PUYwECsTERE+WP3388Va4iITHFvl6mxy2fr1h214uR8BmJl4uPLH/v5Z8DDw/q1EBHZq3bt5C3vbt82vYfNijd7ZyBWZuLE8sfq1LF+HURE9qxWLaBVK7lvSreplTEQKxMUVLZ537y5slKIiOxadQbWWBkD0RjffgtMmQIkJKiuhIjIPtnB1As31QXYhaeekg8iIqqe6ow0tTK2EImIyPLu7TI1dqSplTEQiYjI8tq0AdzcAK0WuHJFdTUVYiASEZHleXjIUASA116z6oR7YzEQiYjIOt56S7YSv/4a6NHD5pbCZCASEZF1jB0L7NkDNGkCnD0L9OwJbNyouio9BiIREVlPnz7A8ePAwIHA3bvAuHHASy8B+fmqK2MgEhGRlTVsCOzYAcydK59/8gnQtCnQuzfw3HPAvHnArVtWL4vzEImIyPpcXYGFC2UIPv+8DMCDB+XjXi7Wa7cxEImISJ0nngAuXZIrgV24IB/JyXLr6ws89JDVSmEgEhGRWrVqAd26yYdCvIZIREQEBiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREABiIREREAB779kxACAKDVahVXQkREqugyQJcJlXHYQMzKygIABAUFKa6EiIhUy8rKgp+fX6XfoxHGxKYdKikpQVpaGnx8fKDRaCzyHlqtFkFBQbh06RJ8fX0t8h6WxPrVYv1qsX61rFW/EAJZWVlo0qQJXFwqv0rosC1EFxcXNGvWzCrv5evra5f/IHVYv1qsXy3Wr5Y16q+qZajDQTVERERgIBIREQFgINaIp6cn5s+fD09PT9WlVAvrV4v1q8X61bLF+h12UA0REZEp2EIkIiICA5GIiAgAA5GIiAgAA9Fot27dwoEDB5Cenq66lGph/WqxfrVYv1p2U79wQunp6aJ58+YiJSXFqOMbN24U/v7+omvXrqJWrVpi48aNRr3PkiVLRMOGDYWPj48YOXKkSE9P139tz549ol27dqJ+/fpi6dKldlf/ypUrRaNGjYSbm5sYNGiQSEtLs6v6dQoKCkSnTp3E7t277bL+MWPGiBkzZhhdu63Ub8zPprL+kpIS8d5774nQ0FBRv359MX36dJGdna3/uq1/fquq39Y/v1XVr1Odz29lnC4Qb968KR588EEBoMxfnKHjGRkZIiAgQJw6dUoIIcTatWtFcHBwle+zd+9e0bFjR3H27Flx/vx58eSTT4q//vWvQgghbty4IXx9fcXbb78tzp07J7p16ybi4uLspv6ff/5ZNGzYUMTGxopLly6Jvn37inHjxtlN/fd65513BACjP1C2VP/27dtFgwYNREZGhlG120r9xv7dqKx/1apVomnTpuLw4cPi7Nmzonv37uK5554TQtjH57ey+u3h81tZ/fcy9fNbFacLxIEDB4rly5eX+4szdDw1NVWsX79e/zw+Pl74+PhU+T7/+te/xKxZs/TP161bJx566CEhhBDLli0Tbdu2FSUlJUIIIbZs2SLGjx9vN/V/9tlnYvPmzfqvff7556JNmzZ2U7/OuXPnhL+/v2jevLnRHyhbqT8nJ0e0bNlSrF692qi6bal+Y/5uVNfft29fsXz5cv3z77//Xv86e/j8Vla/PXx+K6tfpzqf36o4XSAmJycLIUS5vzhDx+9VUFAgnn/+eaN+m/3hhx9Eq1atRFJSkrh+/bro37+/mDdvnhBCiL/97W9i2rRp+u9NS0sT7du3t5v6/+z1118XTz75pN3VP2DAABEZGSn69etn9AfKVuqPiIgQjRs3Fl988YXYtWuX/j9ne6jflH9bqupv3769+Oabb/TPt2/fLvz9/YUQ9vH5raz+P7PFz68x9Vfn81sVpwtEHUN/cYaOnzhxQtStW1cEBgYa3UU1ZMgQAUAAED169BA5OTlCCCFGjhwplixZov++7Oxs4evrazf13ys9PV34+/uLbdu22VX9n3/+uejWrZsoLCys1gdKZf0XL14Unp6eom/fvmLhwoWiW7duYvjw4UaHour6q/qaLdT/7LPPigkTJuifjxkzRowePVoIYR+f38rqv5etfn6rqr+mn19DOMrUSJ07d8auXbvQsWNHTJw4scrv37RpEy5evIizZ8/i1q1b6NSpE5577jkAgJubW5nliry8vJCTk2Ox2gHz1n+v6dOno3fv3hg6dKglytYzZ/03b95EREQEVq9eDTc369zwxZz1r1mzBoGBgYiNjcXcuXOxZ88e7N27F7GxsXZRv7H/tlTWv2jRIhw5cgR9+/ZFly5d8J///AczZswAYB+f38rqv5etfn4rq9+in1+zxKodgom/4eikpqYKjUYjbt++Xen5hw8fLj744AP988zMTAFAZGRkiPDwcDF37lz91zIyMkTt2rXtpn6d1atXi0aNGolr166ZVHtldVqj/nHjxok33nhD/zVrtBDNWf+UKVPExIkTy3x/z549RXR0tF3Ub8y/LdX1CyFHOp45c0aEhYWJQYMG6Y/bw+e3svp1bPnzK4Th+s3x+TWELcQqxMXFYdasWfrnut9IqrrRZFFREa5fv65/fvXqVQBAcXExevTogUOHDum/duLECTRt2tScZetZon4AOHLkCF599VV89dVXCAwMNHfZepao/8svv8SHH34If39/+Pv7Y9++fQgLC0NkZKRd1B8UFITc3Fz910pKSnD58mWEhISYs3QAlqm/qn9b5lTd+gFAo9HA19cXO3fuLPNvwx4+v4Dh+gHb//wChuu36OfXLLFqh2DkbzhXrlwRPj4+YuXKlSI1NVVMmDBBDB48WP/1zMxMUVBQUO48ixcvFg0aNBArVqwQa9asEV27dtWPpLt586bw8vIScXFxorCwUAwdOtTkuWQq67927Zpo2LCheOedd0RWVpb+YS/1p6SklHn06tVLbNy40SItFEvUf/bsWVGnTh3xf//3f+LSpUti9uzZon79+kKr1dpF/ZV9zVbq1wkPDxfPP/98mWP28PmtrH57+PxWVr85Pr+GMBCNOL59+3bRvn174ePjI/7yl7+IGzdu6L8WEhIiYmJiyp0nNzdXvPzyy6JJkybCw8ND9OvXTyQlJem//vHHHwt3d3cREBAgQkJCTO62UFn/smXL9AMi7n3YS/1/ZukuU0vUv23bNtG1a1fh5eUlOnbsKPbt22c39Zvyd6OqfiGEOH/+vPD19RWpqanlvmbrn9/K6reHz29l9f+ZObtMefsnhZKSkpCQkIB+/frB19dXdTlEZAJ+fh0PA5GIiAhc3JuIiAgAA5GIiAgAA5GIiAgAA5GIiAgAA5GIiAgAA5GIiAgAA5GIiAgAA5GIiAgAA5GIiAgA8P9XWFqmmaerHgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x= data[['经度']]\n",
    "y =data[['纬度']]\n",
    "plt.figure(figsize=(5, 5),dpi=100)\n",
    "plt.plot(x, y,'-r',label='纠正的数据')\n",
    "# plt.plot(data_original[['经度']],data_original[['纬度']],label='原始数据')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "218aab19",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-16T06:47:10.352172Z",
     "start_time": "2024-08-16T06:47:09.608654Z"
    }
   },
   "outputs": [],
   "source": [
    "# 保存数据\n",
    "# data.to_excel(\"D:/data/0280/0280_zhongzhi.xlsx\",index=True,header=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "523fdc50",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:26.158832Z",
     "start_time": "2024-08-12T08:34:26.154032Z"
    }
   },
   "outputs": [],
   "source": [
    "# import numpy as np\n",
    "# import pandas as pd\n",
    "# import matplotlib.pyplot as plt\n",
    "# from scipy.interpolate import CubicSpline\n",
    "# plt.rcParams['font.sans-serif']=['SimHei']\n",
    "# plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# #采用众数去替换静止时的经纬度\n",
    "# def jingzhidian(data):\n",
    "#     a=[]\n",
    "#     for i in range(0,len(data)):\n",
    "#         if(data['活动状态'][i]==1):\n",
    "#             a.append(i)\n",
    "#     print(a)\n",
    "\n",
    "#     star=0\n",
    "#     for i in range(0,len(a)):#0-206\n",
    "#         if(i<len(a)):\n",
    "#             if(a[i]-a[i-1]>3):\n",
    "#                 # 计算众数\n",
    "#                 mode_val_1 = data.iloc[star:a[i]]['经度'].value_counts().idxmax()\n",
    "#                 mode_val_2 = data.iloc[star:a[i]]['纬度'].value_counts().idxmax()\n",
    "#                 for j in range(star,a[i]):\n",
    "#                     data['经度'][j]=mode_val_1\n",
    "#                     data['纬度'][j]=mode_val_2\n",
    "#         else:\n",
    "#             if(len(data)-a[i]>3):\n",
    "#                 print(star)\n",
    "#                 mode_val_1 = data.iloc[star:a[i]]['经度'].value_counts().idxmax()\n",
    "#                 mode_val_2 = data.iloc[star:a[i]]['纬度'].value_counts().idxmax()\n",
    "#                 for j in range(star,a[i]):\n",
    "#                     data['经度'][j]=mode_val_1\n",
    "#                     data['纬度'][j]=mode_val_2\n",
    "#         star=a[i]+3\n",
    "#     return data\n",
    "\n",
    "# # 卡尔曼滤波\n",
    "# class KalmanFilter:  \n",
    "#     def __init__(self, process_variance, measurement_variance,x,y): #构造方法\n",
    "#         self.x = np.array([[x], [y]])  # 初始状态：经度和纬度  \n",
    "#         self.P = np.eye(2) * 1.0  # 初始协方差矩阵  \n",
    "#         self.A = np.eye(2)  # 状态转移矩阵  \n",
    "#         self.Q = np.eye(2) * process_variance  # 过程噪声协方差矩阵  \n",
    "#         self.H = np.eye(2)  # 观测矩阵  \n",
    "#         self.R = np.eye(2) * measurement_variance  # 测量噪声协方差矩阵  \n",
    "  \n",
    "#     def update(self, z):  \n",
    "#         # 预测  \n",
    "#         x_pred = np.dot(self.A, self.x)  \n",
    "#         P_pred = np.dot(np.dot(self.A, self.P), self.A.T) + self.Q  #self.A.T为self.A的转置矩阵   （（A*P）*A-1）+Q\n",
    "  \n",
    "#         # 更新  \n",
    "#         S = np.dot(np.dot(self.H, P_pred), self.H.T) + self.R  \n",
    "#         K = np.dot(np.dot(P_pred, self.H.T), np.linalg.inv(S))  #np.linalg.inv(S)计算S矩阵的逆矩阵\n",
    "#         self.x = x_pred + np.dot(K, (z - np.dot(self.H, x_pred))) #更新经纬度的坐标，为下一次预测的初始状态\n",
    "#         self.P = np.dot((np.eye(len(self.x)) - np.dot(K, self.H)), P_pred) #更新协方差矩阵\n",
    "  \n",
    "#     def get_state(self):  \n",
    "#         return self.x \n",
    "    \n",
    "    \n",
    "# # 中值滤波\n",
    "# def zhongzhi(data,step):#data表示数据集，step表示步长即前后取的点数\n",
    "#     long=len(data)\n",
    "#     step=step\n",
    "#     star_index=step\n",
    "#     end_index=long-step\n",
    "#     for i in range(star_index,end_index):\n",
    "#         a=data.iloc[i-step:i+step+1].sort_values(by='经度')\n",
    "#         data.at[i, '经度']=a.iloc[step][1]\n",
    "#         b=data.iloc[i-step:i+step+1].sort_values(by='纬度')\n",
    "#         data.at[i, '纬度']=b.iloc[step][2]\n",
    "#     return data\n",
    "\n",
    "# #线性插值\n",
    "# def xianxingchazhi(data):\n",
    "    \n",
    "#     drop_arr=[]\n",
    "#     result_arr=[]\n",
    "#     for i in range(0,data(len)):\n",
    "#         if(data.iloc[i]['定位状态']==1):\n",
    "#             drop_arr.append(i)\n",
    "#         else:\n",
    "#             result_arr.append(i)\n",
    "    \n",
    "#     # 定义要删除的索引列表  \n",
    "#     # 使用 ~isin 来生成一个布尔索引，这个索引在要删除的索引位置为 False，其他位置为 True  \n",
    "#     bool_index = ~data.index.isin(drop_arr)  \n",
    "\n",
    "#     # 使用这个布尔索引来过滤 DataFrame，得到不包含这些索引的行  \n",
    "#     filtered_data_3 = data.loc[bool_index]  \n",
    "\n",
    "#     # 如果你想要直接修改原始的 DataFrame  \n",
    "#     # 注意：这将改变 data_3，且不会返回任何值（除非你重新赋值给 data_3）  \n",
    "#     # data_3 = data_3.loc[~data_3.index.isin(indices_to_drop)]  \n",
    "    \n",
    "#     #线性插值\n",
    "#     # 假设 data_3 是已经存在的 DataFrame，且其索引与 times 数组对应  \n",
    "#     # ... 这里应该是 data_3 的创建或加载代码 ...  \n",
    "\n",
    "#     # 假设的经纬度数据点（按时间顺序排列）  \n",
    "#     times = np.array(result_arr)  # 时间点  \n",
    "#     longitudes = np.array(filtered_data_3['经度'])  # 经度  \n",
    "#     latitudes = np.array(filtered_data_3['纬度'])        # 纬度  \n",
    "\n",
    "#     # 缺失点的时间  \n",
    "#     # drop_arr = [2.5, 3.5]  # 假设这是缺失的时间点列表  \n",
    "\n",
    "#     for missing_time in drop_arr:  \n",
    "#         # 找到缺失时间点之前的点  \n",
    "#         prev_idx = None  \n",
    "#         for i, t in enumerate(times):  \n",
    "#             if t <= missing_time:  \n",
    "#                 prev_idx = i  \n",
    "#                 if i + 1 < len(times) and times[i + 1] > missing_time:  \n",
    "#                     break  \n",
    "\n",
    "#         # 进行插值  \n",
    "#         if prev_idx is not None and prev_idx + 1 < len(times):  \n",
    "#             t0, t1 = times[prev_idx], times[prev_idx + 1]  \n",
    "#             lon0, lon1 = longitudes[prev_idx], longitudes[prev_idx + 1]  \n",
    "#             lat0, lat1 = latitudes[prev_idx], latitudes[prev_idx + 1]  \n",
    "\n",
    "#             # 线性插值公式  \n",
    "#             lon_missing = lon0 + (lon1 - lon0) * (missing_time - t0) / (t1 - t0)  \n",
    "#             lat_missing = lat0 + (lat1 - lat0) * (missing_time - t0) / (t1 - t0)  \n",
    "\n",
    "#             # 这里假设 data_3 的索引与 times 数组相同  \n",
    "#             # 替换掉表中的数据（如果 data_3 的索引是整数且基于时间点的顺序）  \n",
    "#             # 注意：如果 data_3 的索引不是整数或不是基于时间点，则需要相应地调整索引  \n",
    "#             if missing_time in data.index:  # 确保索引在 DataFrame 中  \n",
    "#                 data.at[data.index[missing_time], '经度'] = round(lon_missing, 6)  \n",
    "#                 data.at[data.index[missing_time], '纬度'] = round(lat_missing, 6)  \n",
    "#             else:  \n",
    "#                 print(f\"Index {prev_idx} is not in data_3\") \n",
    "#         else:  \n",
    "#             print(f\"Missing time point {missing_time} is out of bounds or there are not enough data points for interpolation.\")\n",
    "#     return data\n",
    "\n",
    "# # 三次样条插值\n",
    "# def interpolate_cubic_spline_by_index(series):  \n",
    "#     # 移除NaN值  \n",
    "#     valid_indices = series[~np.isnan(series)].index  \n",
    "#     valid_values = series[~np.isnan(series)]  \n",
    "      \n",
    "#     # 如果没有足够的数据点进行插值，则返回原始序列（或可以填充为NaN）  \n",
    "#     if len(valid_indices) < 2:  # 三次样条至少需要两个点  \n",
    "#         return series.fillna(np.nan)  \n",
    "      \n",
    "#     # 使用DataFrame的索引作为插值的x坐标  \n",
    "#     x_vals = np.array(valid_indices, dtype=float)  # 确保x_vals是浮点数数组（尽管在这个例子中可能是整数）  \n",
    "      \n",
    "#     # 使用CubicSpline进行插值  \n",
    "#     spline = CubicSpline(x_vals, valid_values)  \n",
    "      \n",
    "#     # 对所有索引进行插值（这里我们假设索引是连续的整数，如果不连续，则需要先调整）  \n",
    "#     # 但为了简化，我们直接对整个索引范围进行插值，并替换原始NaN值  \n",
    "#     all_indices = np.arange(len(series))  \n",
    "#     interpolated_values = spline(all_indices)  \n",
    "      \n",
    "#     # 创建一个新的Series来存储插值结果  \n",
    "#     interpolated_series = pd.Series(interpolated_values, index=series.index)  \n",
    "      \n",
    "#     # 返回插值后的Series  \n",
    "#     return interpolated_series\n",
    "\n",
    "# data=pd.read_excel(\"D:/data/HistoricalTrack.xlsx\")\n",
    "\n",
    "# data['活动状态'] = data['设备状态'].str[30:32]\n",
    "# data['定位状态'] = data['设备状态'].str[5:12]\n",
    "# data=data[['定位时间','经度','纬度','活动状态','定位状态']]\n",
    "\n",
    "# #将文字类型转换为数字类型\n",
    "# data['活动状态']=data['活动状态'].map({'静止':0,'运动':1})\n",
    "# data['定位状态']=data['定位状态'].map({'GPS有效定位':0,'GPS无效定位':1})\n",
    "\n",
    "# #选择定位无效的定位点经纬度，并且使用np.nan填充\n",
    "# drop_arr=[]    #定位无效的索引\n",
    "# result_arr=[]  #定位有效的索引\n",
    "# for i in range(0,1960):\n",
    "#     if(data.iloc[i]['定位状态']==1):\n",
    "#         data.at[i,'经度']=np.nan\n",
    "#         data.at[i,'纬度']=np.nan\n",
    "#         drop_arr.append(i)\n",
    "#     else:\n",
    "#         result_arr.append(i)\n",
    "        \n",
    "# # 对经度和纬度进行插值  \n",
    "# data['经度'] = interpolate_cubic_spline_by_index(data['经度'])\n",
    "# data['纬度'] = interpolate_cubic_spline_by_index(data['纬度'])\n",
    "\n",
    "# data=jingzhidian(data)\n",
    "# data=zhongzhi(data,step=2)\n",
    "# data.iloc[610:622]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "629951a8",
   "metadata": {},
   "source": [
    "# 停车超时"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "6e5ba934",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:27.259754Z",
     "start_time": "2024-08-12T08:34:27.257326Z"
    }
   },
   "outputs": [],
   "source": [
    "# data_feature=data[['定位时间','经度','纬度']]\n",
    "# data_feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "5eb18000",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:27.619468Z",
     "start_time": "2024-08-12T08:34:27.616738Z"
    }
   },
   "outputs": [],
   "source": [
    "# point=np.array(data_feature[['经度','纬度']])\n",
    "# point"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "4ffc077e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:28.499889Z",
     "start_time": "2024-08-12T08:34:28.496868Z"
    }
   },
   "outputs": [],
   "source": [
    "# from sklearn.cluster import DBSCAN  \n",
    "# from sklearn.datasets import make_blobs  \n",
    "# import matplotlib.pyplot as plt\n",
    "# import sklearn.cluster as skc\n",
    "\n",
    "# # 生成一个随机数据集  \n",
    "# # X, y = make_blobs(n_samples=1000, centers=8, random_state=42)\n",
    "  \n",
    "# # 创建DBSCAN聚类器  \n",
    "# dbscan = DBSCAN(eps=0.00001, min_samples=19).fit(point) \n",
    "# #eps=0.00001表示以一米为半径画圆，min_samples=11即为有10个间隔10*30/60=5分钟\n",
    "\n",
    "# # 进行聚类\n",
    "# labels = dbscan.labels_ #labels为每个数据的簇标签\n",
    "\n",
    "# # 可视化聚类结果\n",
    "# plt.scatter(point[:, 0], point[:, 1], c=labels, cmap='rainbow')\n",
    "# plt.legend()\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "211b1f46",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:28.891400Z",
     "start_time": "2024-08-12T08:34:28.888622Z"
    }
   },
   "outputs": [],
   "source": [
    "# data['labels']=labels\n",
    "# data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "2199975d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:29.379250Z",
     "start_time": "2024-08-12T08:34:29.377156Z"
    }
   },
   "outputs": [],
   "source": [
    "# #种类数量\n",
    "# n_clusters_ = len(set(data['labels'])) - (1 if -1 in labels else 0)\n",
    "# n_clusters_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "e4e9b28e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:29.708569Z",
     "start_time": "2024-08-12T08:34:29.706358Z"
    }
   },
   "outputs": [],
   "source": [
    "# data.groupby(data['labels']).count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "642ec752",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:30.131885Z",
     "start_time": "2024-08-12T08:34:30.129149Z"
    }
   },
   "outputs": [],
   "source": [
    "# #将不在时间范围内的数据标签改为默认值-1\n",
    "# def function_1(x,lei):\n",
    "#     count=0\n",
    "#     num=0\n",
    "#     for i in range(0,len(data)):\n",
    "#         if(data['labels'][i]==x):\n",
    "#             count=count+1\n",
    "#             #仅针对最后一类数据做二级分类处理\n",
    "#             if(i==len(data)-1):\n",
    "#                 num=num+1\n",
    "#                 if(num>1):\n",
    "#                     for k in range(i-count,i):\n",
    "#                         data['labels'][k]=lei\n",
    "#                         lei=lei+1\n",
    "#         else:\n",
    "#             if(count!=0 and count<=19):#筛选出聚类结果当中时间小于5分钟的经纬度归为离散数据-1\n",
    "#                 for j in range(i-count,i):\n",
    "#                     data['labels'][j]=-1\n",
    "#             elif(count!=0 and count>19):#筛选出聚类结果当中时间超过5分钟的经纬度\n",
    "#                 num=num+1\n",
    "#                 if(num>1):#如果在聚类当中的时间段分离（即类中分段）则按时间规则将聚类结果进行二级分类\n",
    "#                     for k in range(i-count,i):\n",
    "#                         data['labels'][k]=lei\n",
    "#                     lei=lei+1\n",
    "#             count=0\n",
    "#     print(num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "c96742c2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:36.923828Z",
     "start_time": "2024-08-12T08:34:36.921271Z"
    }
   },
   "outputs": [],
   "source": [
    "# for i in range(0,n_clusters_):\n",
    "#     function_1(i,n_clusters_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "dfa4e980",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:38.755853Z",
     "start_time": "2024-08-12T08:34:38.752931Z"
    }
   },
   "outputs": [],
   "source": [
    "# data.groupby(data['labels']).count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "c6788248",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:39.523212Z",
     "start_time": "2024-08-12T08:34:39.521169Z"
    }
   },
   "outputs": [],
   "source": [
    "# # 停车的次数\n",
    "# n_clusters_1= len(set(data['labels'])) - (1 if -1 in labels else 0)\n",
    "# n_clusters_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "49acef42",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:40.707343Z",
     "start_time": "2024-08-12T08:34:40.705062Z"
    }
   },
   "outputs": [],
   "source": [
    "# plt.scatter(point[:, 0], point[:, 1], c=data['labels'], cmap='rainbow')\n",
    "# plt.legend()\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "bccabfc7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:42.171539Z",
     "start_time": "2024-08-12T08:34:42.169052Z"
    }
   },
   "outputs": [],
   "source": [
    "# 保存数据\n",
    "# data.to_excel(\"D:/data/kashi_jvlei.xlsx\",index=True,header=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "cd3b5913",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:43.011724Z",
     "start_time": "2024-08-12T08:34:43.009229Z"
    }
   },
   "outputs": [],
   "source": [
    "# # 停车的时间\n",
    "# # 转换定位时间的数据类型\n",
    "# data['定位时间'] = pd.to_datetime(data['定位时间'])\n",
    "# data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "7bc39e00",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:43.640361Z",
     "start_time": "2024-08-12T08:34:43.637458Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# data.iloc[45:100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "0e1d4c19",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:44.067155Z",
     "start_time": "2024-08-12T08:34:44.064650Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# def park_info(label):\n",
    "#     a=[]\n",
    "#     for i in range(0,len(data)):\n",
    "#         if data['labels'][i]==label:\n",
    "#             a.append(i)\n",
    "#     star=a[0]\n",
    "#     end=a[len(a)-1]\n",
    "#     park_time=data['定位时间'][end]-data['定位时间'][star]\n",
    "#     print('label={labels}的停车开始时间:{star_time}'.format(labels=label,star_time=data['定位时间'][star]))\n",
    "#     print('label={labels}的停车结束时间:{end_time}'.format(labels=label,end_time=data['定位时间'][end]))\n",
    "#     print('label={labels}的停车时长:{park_time}'.format(labels=label,park_time=park_time))\n",
    "#     print('label={labels}的停车位置：经度{longitude}，纬度{latitude}'.format(labels=label,longitude=data['经度'][star],latitude=data['纬度'][star]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "1322af5b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:44.947416Z",
     "start_time": "2024-08-12T08:34:44.945519Z"
    }
   },
   "outputs": [],
   "source": [
    "# for i in range(1,n_clusters_1+1):\n",
    "#     park_info(data['labels'].unique()[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "92c15cf3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:45.476027Z",
     "start_time": "2024-08-12T08:34:45.473081Z"
    }
   },
   "outputs": [],
   "source": [
    "# class park_info:\n",
    "#     @staticmethod\n",
    "#     def park_time(label):\n",
    "#         a=[]\n",
    "#         for i in range(0,len(data)):\n",
    "#             if data['labels'][i]==label:\n",
    "#                 a.append(i)\n",
    "#         star=a[0]\n",
    "#         end=a[len(a)-1]\n",
    "#         park_time=data['定位时间'][end]-data['定位时间'][star]\n",
    "#         print('label={labels}的停车开始时间:{star_time}'.format(labels=label,star_time=data['定位时间'][star]))\n",
    "#         print('         停车结束时间:{end_time}'.format(end_time=data['定位时间'][end]))\n",
    "#         print('         停车时长:{park_time}'.format(park_time=park_time))\n",
    "#         print('         停车位置：经度{longitude}，纬度{latitude}'.format(longitude=data['经度'][star],latitude=data['纬度'][star]))\n",
    "\n",
    "#     def get_info(self,data):\n",
    "#         # 停车的次数  n_clusters_1\n",
    "#         n_clusters_1= len(set(data['labels'])) - (1 if -1 in labels else 0)\n",
    "#         for i in range(1,n_clusters_1+1):\n",
    "#             self.park_time(data['labels'].unique()[i])\n",
    "#         print('停车次数：{count}'.format(count=n_clusters_1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "ba45f1c9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:46.181219Z",
     "start_time": "2024-08-12T08:34:46.179079Z"
    }
   },
   "outputs": [],
   "source": [
    "# until=park_info()\n",
    "# until.get_info(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "600d2fb0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:46.882302Z",
     "start_time": "2024-08-12T08:34:46.879714Z"
    }
   },
   "outputs": [],
   "source": [
    "# data['labels'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "59cfa637",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:47.715148Z",
     "start_time": "2024-08-12T08:34:47.712740Z"
    }
   },
   "outputs": [],
   "source": [
    "# data_feature=data[['定位时间','经度','纬度']]\n",
    "# point=np.array(data_feature[['经度','纬度']])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "d6624285",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:48.810481Z",
     "start_time": "2024-08-12T08:34:48.801180Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.cluster import DBSCAN  \n",
    "from sklearn.datasets import make_blobs  \n",
    "import matplotlib.pyplot as plt\n",
    "import sklearn.cluster as skc\n",
    "\n",
    "\n",
    "class Parking:\n",
    "    @staticmethod\n",
    "    def first_class(data, time,point):\n",
    "        # 创建DBSCAN聚类器\n",
    "        dbscan = DBSCAN(eps=0.0002, min_samples=2 * time + 1).fit(point)\n",
    "        # eps=0.00001表示以一米为半径画圆，min_samples=11即为有10个间隔10*30/60=5分钟\n",
    "        # 进行聚类\n",
    "        labels = dbscan.labels_  # labels为每个数据的簇标签\n",
    "        data['labels'] = labels\n",
    "        return data\n",
    "\n",
    "    # 将不在时间范围内的数据标签改为默认值-1，同时以时间维度进行二级分类\n",
    "    @staticmethod\n",
    "    def seconde_class(data,x, lei, time):\n",
    "        count = 0\n",
    "        num = 0\n",
    "        for i in range(0, len(data)):\n",
    "            if (data['labels'][i] == x):\n",
    "                count = count + 1\n",
    "                # 仅针对最后一类数据做二级分类处理\n",
    "                if (i == len(data) - 1):\n",
    "                    num = num + 1\n",
    "                    if (num > 1):\n",
    "                        for k in range(i - count, i):\n",
    "                            data['labels'][k] = lei\n",
    "                            lei = lei + 1\n",
    "            else:\n",
    "                if (count != 0 and count <= 2 * time + 1):  # 筛选出聚类结果当中时间小于5分钟的经纬度归为离散数据-1\n",
    "                    for j in range(i - count, i):\n",
    "                        data['labels'][j] = -1\n",
    "                elif (count != 0 and count > 2 * time + 1):  # 筛选出聚类结果当中时间超过5分钟的经纬度\n",
    "                    num = num + 1\n",
    "                    if (num > 1):  # 如果在聚类当中的时间段分离（即类中分段）则按时间规则将聚类结果进行二级分类\n",
    "                        for k in range(i - count, i):\n",
    "                            data['labels'][k] = lei\n",
    "                        lei = lei + 1\n",
    "                count = 0\n",
    "        return data\n",
    "\n",
    "    @staticmethod\n",
    "    def park_time(data,label):\n",
    "        a = []\n",
    "        for i in range(0, len(data)):\n",
    "            if data['labels'][i] == label:\n",
    "                a.append(i)\n",
    "        star = a[0]\n",
    "        end = a[len(a) - 1]\n",
    "        park_time = data['定位时间'][end] - data['定位时间'][star]\n",
    "        print('label={labels}的停车开始时间:{star_time}'.format(labels=label, star_time=data['定位时间'][star]))\n",
    "        print('         停车结束时间:{end_time}'.format(end_time=data['定位时间'][end]))\n",
    "        print('         停车时长:{park_time}'.format(park_time=park_time))\n",
    "        print('         停车位置：经度{longitude}，纬度{latitude}'.format(longitude=data['经度'][star],\n",
    "                                                                        latitude=data['纬度'][star]))\n",
    "\n",
    "    def get_info(self, data, time,point):\n",
    "        # 一级分类\n",
    "        first_data = self.first_class(data, time,point)\n",
    "        # 一级分类后种类数量\n",
    "        #种类数量\n",
    "        n_clusters_before = first_data['labels'].unique().size-1\n",
    "        \n",
    "        # 二级分类\n",
    "        for i in range(0, n_clusters_before):\n",
    "            seconde_data=self.seconde_class(first_data,i, n_clusters_before, time)\n",
    "\n",
    "        # 停车的次数  n_clusters_after\n",
    "        n_clusters_after = seconde_data['labels'].unique().size-1\n",
    "\n",
    "        # 停车的时间\n",
    "        # 转换定位时间的数据类型\n",
    "        seconde_data['定位时间'] = pd.to_datetime(seconde_data['定位时间'])\n",
    "\n",
    "        for i in range(1, n_clusters_after + 1): # 从1开始取就不会取到-1\n",
    "            self.park_time(seconde_data,data['labels'].unique()[i])\n",
    "        print('停车次数：{count}'.format(count=n_clusters_after))\n",
    "        return seconde_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "12e7304f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:50.039584Z",
     "start_time": "2024-08-12T08:34:49.961475Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label=0的停车开始时间:2024-08-08 00:54:06\n",
      "         停车结束时间:2024-08-08 14:07:53\n",
      "         停车时长:0 days 13:13:47\n",
      "         停车位置：经度73.9605154246396，纬度39.726994380984635\n",
      "label=1的停车开始时间:2024-08-08 14:09:50\n",
      "         停车结束时间:2024-08-08 18:18:53\n",
      "         停车时长:0 days 04:09:03\n",
      "         停车位置：经度73.96307724653846，纬度39.721593882835315\n",
      "停车次数：2\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16660\\621493937.py:15: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  data['labels'] = labels\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_16660\\621493937.py:77: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  seconde_data['定位时间'] = pd.to_datetime(seconde_data['定位时间'])\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位状态</th>\n",
       "      <th>labels</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-08-07 17:01:00</td>\n",
       "      <td>76.016140</td>\n",
       "      <td>39.548380</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-08-07 17:05:02</td>\n",
       "      <td>76.019662</td>\n",
       "      <td>39.550082</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-08-07 17:05:32</td>\n",
       "      <td>76.019293</td>\n",
       "      <td>39.550759</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-08-07 17:06:02</td>\n",
       "      <td>76.017168</td>\n",
       "      <td>39.550969</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-08-07 17:06:32</td>\n",
       "      <td>76.015460</td>\n",
       "      <td>39.551110</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3052</th>\n",
       "      <td>2024-08-08 18:29:21</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3053</th>\n",
       "      <td>2024-08-08 18:29:51</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3054</th>\n",
       "      <td>2024-08-08 18:30:21</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3055</th>\n",
       "      <td>2024-08-08 18:30:50</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3056</th>\n",
       "      <td>2024-08-08 18:30:51</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3057 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    定位时间         经度         纬度  活动状态  定位状态  labels\n",
       "0    2024-08-07 17:01:00  76.016140  39.548380     1     0      -1\n",
       "1    2024-08-07 17:05:02  76.019662  39.550082     1     0      -1\n",
       "2    2024-08-07 17:05:32  76.019293  39.550759     1     0      -1\n",
       "3    2024-08-07 17:06:02  76.017168  39.550969     1     0      -1\n",
       "4    2024-08-07 17:06:32  76.015460  39.551110     1     0      -1\n",
       "...                  ...        ...        ...   ...   ...     ...\n",
       "3052 2024-08-08 18:29:21  73.962800  39.714252     0     0      -1\n",
       "3053 2024-08-08 18:29:51  73.962800  39.714252     0     0      -1\n",
       "3054 2024-08-08 18:30:21  73.962800  39.714252     0     0      -1\n",
       "3055 2024-08-08 18:30:50  73.962800  39.714252     1     0      -1\n",
       "3056 2024-08-08 18:30:51  73.962800  39.714252     1     0      -1\n",
       "\n",
       "[3057 rows x 6 columns]"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "until=Parking()\n",
    "until.get_info(data,120,point)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "6f8025bd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:55.553824Z",
     "start_time": "2024-08-12T08:34:55.545356Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>定位时间</th>\n",
       "      <th>经度</th>\n",
       "      <th>纬度</th>\n",
       "      <th>活动状态</th>\n",
       "      <th>定位状态</th>\n",
       "      <th>labels</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-08-07 17:01:00</td>\n",
       "      <td>76.016140</td>\n",
       "      <td>39.548380</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-08-07 17:05:02</td>\n",
       "      <td>76.019662</td>\n",
       "      <td>39.550082</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-08-07 17:05:32</td>\n",
       "      <td>76.019293</td>\n",
       "      <td>39.550759</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-08-07 17:06:02</td>\n",
       "      <td>76.017168</td>\n",
       "      <td>39.550969</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-08-07 17:06:32</td>\n",
       "      <td>76.015460</td>\n",
       "      <td>39.551110</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3052</th>\n",
       "      <td>2024-08-08 18:29:21</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3053</th>\n",
       "      <td>2024-08-08 18:29:51</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3054</th>\n",
       "      <td>2024-08-08 18:30:21</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3055</th>\n",
       "      <td>2024-08-08 18:30:50</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3056</th>\n",
       "      <td>2024-08-08 18:30:51</td>\n",
       "      <td>73.962800</td>\n",
       "      <td>39.714252</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3057 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                    定位时间         经度         纬度  活动状态  定位状态  labels\n",
       "0    2024-08-07 17:01:00  76.016140  39.548380     1     0      -1\n",
       "1    2024-08-07 17:05:02  76.019662  39.550082     1     0      -1\n",
       "2    2024-08-07 17:05:32  76.019293  39.550759     1     0      -1\n",
       "3    2024-08-07 17:06:02  76.017168  39.550969     1     0      -1\n",
       "4    2024-08-07 17:06:32  76.015460  39.551110     1     0      -1\n",
       "...                  ...        ...        ...   ...   ...     ...\n",
       "3052 2024-08-08 18:29:21  73.962800  39.714252     0     0      -1\n",
       "3053 2024-08-08 18:29:51  73.962800  39.714252     0     0      -1\n",
       "3054 2024-08-08 18:30:21  73.962800  39.714252     0     0      -1\n",
       "3055 2024-08-08 18:30:50  73.962800  39.714252     1     0      -1\n",
       "3056 2024-08-08 18:30:51  73.962800  39.714252     1     0      -1\n",
       "\n",
       "[3057 rows x 6 columns]"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "f514c3c9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:34:56.174951Z",
     "start_time": "2024-08-12T08:34:56.072801Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
     ]
    },
    {
     "data": {
      "image/png": "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11lwHX+t9ezZk7/85S+0adOGsrIyxo4dy4033kjjxo0BXWuh4PhrLTExkaKiomNidu3axYUXXui1nVq71hx/SFWPnHvuucZLL71U+XVmZqaxY8eOytfVV19tTJ061cjOzjYMwzDy8/ONkpKSE9rJzs42oqOjjaVLlxqlpaXGFVdcYdx1111B+z4aisLCQiMyMtLYsmVLtTHHj4Hp2LGj8c4775wQV1JSYtx8881Gs2bNjC5duhgPPfSQUVpa6kDWcvx19sorrxjJycnG8uXLjY8//thISUkxbr755srPdZ3VvuqutYkTJxpxcXFGYmKicffddxsHDx6s/EzXWu07/lrLzc01YmNjjeeff97IzMw0nn76aSMqKqpyBmeoXWsqYGwK5M3QMAzjX//6lxEREWHEx8cbHTt2NH766acAZyxS9wTyRmgYus5EqlPdtbZ69Wqjf//+RqNGjYzOnTsfc22F2rXmMgzDcL6fR6qybds2tmzZwvnnn+/TIGARsU/XmUhwBPtaUwEjIiIidY5mIYmIiEidowJGRERE6hwVMCIiIlLnqIARERGROkcFjIiIiNQ5KmBERESkzlEBIyIiInWOChgRERGpc1TAiIiISJ3z/+CtJxOvmGvzAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(point[:, 0], point[:, 1], c=data['labels'], cmap='rainbow')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "029e7d27",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-12T08:35:02.005830Z",
     "start_time": "2024-08-12T08:35:01.753024Z"
    }
   },
   "outputs": [],
   "source": [
    "# 保存数据\n",
    "# data.to_excel(\"D:/data/399072003946/399072003946_kaer_jvlei.xlsx\",index=True,header=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f5f67ecd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
